package com.ruoyi.generator.domain;

import cn.hutool.json.JSONUtil;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.UUIDGenerator;
import com.ruoyi.common.utils.StringUtils;
import jakarta.annotation.Nullable;
import org.babyfish.jimmer.Formula;
import org.babyfish.jimmer.sql.*;

import java.util.List;

/**
 * 业务表 gen_table
 *
 * @author ruoyi
 */
@Entity
@Table(name = "gen_table")
public interface GenTable extends BaseEntity {

    /**
     * 编号
     */
    @Id
    @GeneratedValue(generatorType = UUIDGenerator.class)
    String tableId();

    /**
     * 表名称
     */
    String tableName();

    /**
     * 表描述
     */
    String tableComment();

    /**
     * 关联父表的表名
     */
    @Nullable
    String subTableName();

    /**
     * 本表关联父表的外键名
     */
    @Nullable
    String subTableFkName();

    /**
     * 实体类名称(首字母大写)
     */
    String className();

    /**
     * 使用的模板（crud单表操作 tree树表操作 sub主子表操作）
     */
    @Nullable
    String tplCategory();

    /**
     * 前端类型（element-ui模版 element-plus模版）
     */
    @Nullable
    String tplWebType();

    /**
     * 生成包路径
     */
    String packageName();

    /**
     * 生成模块名
     */
    String moduleName();

    /**
     * 生成业务名
     */
    String businessName();

    /**
     * 生成功能名
     */
    String functionName();

    /**
     * 生成作者
     */
    String functionAuthor();

    /**
     * 生成代码方式（0zip压缩包 1自定义路径）
     */
    @Nullable
    String genType();

    /**
     * 生成路径（不填默认项目路径）
     */
    @Nullable
    String genPath();

    /**
     * 表列信息
     */
    @OneToMany(mappedBy = "table", orderedProps = {@OrderedProp("sort")})
    List<GenTableColumn> columns();

    /**
     * 其它生成选项
     */
    @Nullable
    String options();

    /**
     * 树编码字段
     */
    @Formula(dependencies = {"tplCategory", "options"})
    default String treeCode() {
        if (tplCategory() != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory()) && options() != null) {
            return JSONUtil.parseObj(options()).getStr("treeCode");
        } else {
            return null;
        }
    }

    /**
     * 树父编码字段
     */
    @Formula(dependencies = {"tplCategory", "options"})
    default String treeParentCode() {
        if (tplCategory() != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory()) && options() != null) {
            return JSONUtil.parseObj(options()).getStr("treeParentCode");
        } else {
            return null;
        }
    }

    /**
     * 树名称字段
     */
    @Formula(dependencies = {"tplCategory", "options"})
    default String treeName() {
        if (tplCategory() != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory()) && options() != null) {
            return JSONUtil.parseObj(options()).getStr("treeName");
        } else {
            return null;
        }
    }

    /**
     * 上级菜单ID字段
     */
    @Formula(dependencies = {"options"})
    default String parentMenuId() {
        if (options() != null) {
            return JSONUtil.parseObj(options()).getStr("parentMenuId");
        } else {
            return null;
        }
    }

    /**
     * 上级菜单名称字段
     */
    @Formula(dependencies = {"options"})
    default String parentMenuName() {
        if (options() != null) {
            return JSONUtil.parseObj(options()).getStr("parentMenuName");
        } else {
            return null;
        }
    }

    @Formula(dependencies = "tplCategory")
    default boolean isCrud() {
        return tplCategory() != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory());
    }

    @Formula(dependencies = "tplCategory")
    default boolean isTree() {
        return tplCategory() != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory());
    }

    @Formula(dependencies = "tplCategory")
    default boolean isSub() {
        return tplCategory() != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory());
    }
}
